home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE08 / DATADICT / MYSTRNG.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-02-01  |  12.8 KB  |  433 lines

  1. UNIT mystrng;{had to change name from strings...}
  2. INTERFACE
  3.  
  4. CONST
  5.   comma                    = ',';
  6.   space                    = ' ';
  7.   quote                    = '"';
  8.   period                   = '.';
  9.   cr                       = CHR(13);
  10.   lf                       = CHR(10);
  11.   tab                      = CHR(9);
  12.   ff                       = CHR(12);
  13.   bs                       = CHR(8);
  14.   ctlz                     = CHR(26);
  15.   numerics                 : SET OF CHAR = ['0'..'9'];
  16.   signed                   : set of char = ['-','+'];
  17.   science                  : SET OF CHAR = ['e', 'E'];
  18.   percts                   : SET OF CHAR = ['%'];
  19.   alpha                    : SET OF CHAR = ['a'..'z', 'A'..'Z'];
  20.   crlf                     : SET OF CHAR = [cr, lf];
  21.   ok_ctl                   : SET OF CHAR = [cr, lf, tab, ff, bs];
  22.   printables               : SET OF CHAR = [' '..'~'];
  23.   punctuation              : SET OF CHAR = [' '..'/', ':'..'@', '['..'`', '{'..'}'];
  24.  
  25. TYPE
  26.   charset                  = SET OF CHAR;
  27.   string132                = STRING[132];
  28.   string80                 = STRING[80];
  29.   string40                 = STRING[40];
  30.   string20                 = STRING[16];
  31.   string10                 = STRING[10];
  32.   string8                  = STRING[8];
  33.   string5                  = STRING[5];
  34.   string2                  = STRING[2];
  35.  
  36. VAR
  37.   scientific,
  38.   percent,
  39.   delete_percent           : BOOLEAN;
  40.  
  41. FUNCTION get_word(wrkstr : STRING; nth_word : BYTE) : STRING;
  42.  
  43. FUNCTION trim(workstr : STRING) : STRING;
  44.  
  45. FUNCTION right(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  46.  
  47. FUNCTION left(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  48.  
  49. FUNCTION center(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  50.  
  51. FUNCTION get_word_upto(wrkstr : STRING; delim : CHAR) : STRING;
  52.  
  53. FUNCTION get_words_from(wrkstr : STRING; delim : CHAR) : STRING;
  54.  
  55. FUNCTION upper(some_word : string) : string;
  56.  
  57. PROCEDURE parse(workstring               : STRING;
  58.                 VAR first_word,
  59.                 remainder                : STRING);
  60.  
  61. FUNCTION copies(num : INTEGER; wrkstr : STRING) : STRING;
  62.  
  63. FUNCTION find_next_char_position(of_these_char : charset; workline : STRING; start : BYTE) : BYTE;
  64.  
  65. FUNCTION next_symbol(workline : STRING; VAR ndx : BYTE) : STRING;
  66.  
  67. FUNCTION occurs(symbol : STRING; looking_for : charset) : INTEGER;
  68.  
  69. FUNCTION is_number(VAR symbol               : STRING;
  70.                    uses_exp                 : BOOLEAN;
  71.                    uses_percents            : BOOLEAN;
  72.                    delete_percents          : BOOLEAN) : BOOLEAN;
  73.  
  74. FUNCTION parse_section(start, finish : BYTE; workline : STRING) : STRING;
  75.  
  76. {conversion routines numbers to string and vice versa}
  77.  
  78. function CommaDelimstrToInt(const s: string): longint;
  79.  
  80.  
  81. FUNCTION real_str(real_value : REAL; exponential : BOOLEAN;
  82.                   field_width, decimal_width : INTEGER) : string80;
  83.  
  84. FUNCTION boostr(boolean_value : BOOLEAN) : string5;
  85.  
  86. FUNCTION int_str(integer_value, field_width : INTEGER) : string10;
  87.  
  88. FUNCTION search_back_for(somestr : STRING; start_point : BYTE; target :char):byte;
  89.  
  90.  
  91. IMPLEMENTATION
  92. USES sysutils;
  93. CONST
  94.   copyright                = 'Copyright 1989, 1995 by Brandon C. Smith.';
  95.   address                  = 'RR 2, Box 229-5, Mansfield, MO  65704';
  96.   phone                    = '(417)-924-8021';
  97.   email                    = 'Synature@aol.com';
  98.   version                  = 1.04;
  99. {890401 .01 bcs incorporates find_next_char, next_symbol, occurs, parse_section
  100.                 and a slew of character constants.}
  101. {890527 .02 bcs Changed get_word to recognize #13 as the end of string and not
  102.                 include it.}
  103. {890709 .03 bcs added draw_box_str}
  104. {890723 .04 bcs added search_back_for}
  105. {951123 .05 bcs moved to Delphi wrklib}
  106.  
  107.   function CommaDelimstrToInt(const s: string): longint;
  108.   var i : integer;
  109.       tmpstr : string;
  110.   begin
  111.     tmpstr := '';
  112.     for i := 1 to length(s) do
  113.       if s[i] in numerics
  114.         then tmpstr := tmpstr + s[i];
  115.     if tmpstr = ''
  116.       then tmpstr := '0';
  117.     result := StrToInt(tmpstr);
  118.   end;
  119.  
  120.  
  121.  
  122. FUNCTION search_back_for(somestr : STRING; start_point : BYTE; target :char):byte;
  123. VAR
  124.  i : BYTE;
  125.  ch : CHAR;
  126. BEGIN
  127.   i := start_point;
  128.   REPEAT
  129.     ch := somestr[i];
  130.     DEC(i);
  131.   UNTIL (ch = ' ') OR (i = 0);
  132.   search_back_for := i+1;
  133. END;
  134.  
  135.  
  136.   FUNCTION trim(workstr : STRING) : STRING;
  137.   VAR first_char, last_char : INTEGER;
  138.     done                     : BOOLEAN;
  139.   BEGIN
  140.     done := FALSE;
  141.     first_char := 1;
  142.     REPEAT
  143.       IF workstr[first_char] <> ' ' THEN done := TRUE
  144.       ELSE INC(first_char);
  145.     UNTIL done OR (first_char = LENGTH(workstr));
  146.     done := FALSE;
  147.     last_char := LENGTH(workstr);
  148.     REPEAT
  149.       IF workstr[last_char] <> ' ' THEN done := TRUE
  150.       ELSE DEC(last_char);
  151.     UNTIL done OR (last_char = 1);
  152.     trim := COPY(workstr, first_char, last_char - first_char + 1);
  153.   END;
  154.  
  155.   FUNCTION get_word(wrkstr : STRING; nth_word : BYTE) : STRING;
  156.   VAR i, ndx, start_pt, end_pt : BYTE;
  157.     found                    : BOOLEAN;
  158.   BEGIN
  159.     IF LENGTH(wrkstr) = 0
  160.       THEN BEGIN
  161.         get_word := '';
  162.         EXIT;
  163.         END;
  164.     ndx := 1;
  165.     FOR i := 1 TO nth_word DO
  166.     BEGIN
  167.       found := FALSE;
  168.       REPEAT                      { find first non blank }
  169.         IF wrkstr[ndx] = ' '
  170.           THEN INC(ndx)
  171.           ELSE BEGIN
  172.             start_pt := ndx;
  173.             found := TRUE;
  174.             END;
  175.       UNTIL found;
  176.       found := FALSE;
  177.       REPEAT                      { find end of this word }
  178.         IF (ndx > LENGTH(wrkstr)) OR (wrkstr[ndx] = ' ') or (wrkstr[ndx] = #13)
  179.           THEN BEGIN
  180.             end_pt := ndx - 1;
  181.             found := TRUE;
  182.             END
  183.           ELSE INC(ndx);
  184.       UNTIL found;
  185.     END;
  186.     get_word := COPY(wrkstr, start_pt, end_pt - start_pt + 1);
  187.   END;
  188.  
  189.   FUNCTION get_word_upto(wrkstr : STRING; delim : CHAR) : STRING;
  190.   VAR i                    : INTEGER;
  191.     found                    : BOOLEAN;
  192.   BEGIN
  193.     found := FALSE;
  194.     i := 1;
  195.     REPEAT
  196.       INC(i);
  197.       IF wrkstr[i] = delim THEN found := TRUE;
  198.       IF i > LENGTH(wrkstr) THEN found := TRUE;
  199.     UNTIL found;
  200.     get_word_upto := COPY(wrkstr, 1, i - 1);
  201.   END;
  202.  
  203.   FUNCTION get_words_from(wrkstr : STRING; delim : CHAR) : STRING;
  204.   VAR i                    : INTEGER;
  205.     found                    : BOOLEAN;
  206.   BEGIN
  207.     found := FALSE;
  208.     i := 0;
  209.     REPEAT
  210.       INC(i);
  211.       IF wrkstr[i] = delim THEN found := TRUE;
  212.       IF i > LENGTH(wrkstr) THEN found := TRUE;
  213.     UNTIL found;
  214.     IF i > LENGTH(wrkstr) THEN get_words_from := ''
  215.     ELSE get_words_from := COPY(wrkstr, i + 1, 80);
  216.   END;
  217.  
  218.   FUNCTION left(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  219.   VAR i                    : INTEGER;
  220.   VAR wrkstr               : STRING;
  221.   BEGIN
  222.     wrkstr := COPY(trim(in_string), 1, size);
  223.     IF LENGTH(wrkstr) < size
  224.     THEN
  225.     BEGIN
  226.       FOR i := LENGTH(wrkstr) TO size - 1 DO
  227.         wrkstr := wrkstr + pad
  228.     END;
  229.     left := wrkstr;
  230.   END;
  231.  
  232.  
  233.   FUNCTION right(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  234.   VAR i                    : INTEGER;
  235.   VAR wrkstr               : STRING;
  236.   BEGIN
  237.     i := LENGTH(trim(in_string)) - size + 1;
  238.     IF i <= 0 THEN wrkstr := COPY(trim(in_string), 1, size)
  239.     ELSE wrkstr := COPY(trim(in_string), i, size);
  240.     IF LENGTH(wrkstr) < size
  241.     THEN
  242.     BEGIN
  243.       FOR i := 1 TO (size - LENGTH(wrkstr)) DO
  244.         wrkstr := pad + wrkstr
  245.     END;
  246.     right := wrkstr;
  247.   END;
  248.  
  249.   FUNCTION copies(num : INTEGER; wrkstr : STRING) : STRING;
  250.   VAR i                    : INTEGER;
  251.     tempstr                  : STRING;
  252.   BEGIN
  253.     tempstr := '';
  254.     FOR i := 1 TO num DO
  255.     BEGIN
  256.       tempstr := tempstr + wrkstr;
  257.     END;
  258.     copies := tempstr;
  259.   END;
  260.  
  261.   FUNCTION center(in_string : STRING; size : BYTE; pad : CHAR) : STRING;
  262.   VAR i                    : INTEGER;
  263.     wrkstr                   : STRING;
  264.   BEGIN
  265.     wrkstr := copies(size, ' ');
  266.     i := (size DIV 2) - (LENGTH(trim(in_string)) DIV 2);
  267.     IF i <= 0 THEN INSERT(trim(in_string), wrkstr, 1)
  268.     ELSE INSERT(trim(in_string), wrkstr, i);
  269.     center := COPY(wrkstr, 1, size);
  270.   END;
  271.  
  272.   FUNCTION upper(some_word : string) : string;
  273.   VAR i : INTEGER;
  274.   BEGIN
  275.     result := '';
  276.     FOR i := 1 TO LENGTH(some_word) DO
  277.         result := result + UPCASE(some_word[i]);
  278.   END;
  279.  
  280.  
  281.   PROCEDURE parse(workstring               : STRING;
  282.                   VAR first_word,
  283.                   remainder                : STRING);
  284.   BEGIN
  285.     workstring := trim(workstring);
  286.     first_word := get_word(workstring, 1);
  287.     remainder := trim(COPY(workstring, LENGTH(first_word) + 1, 255));
  288.   END;
  289.  
  290.   FUNCTION find_next_char_position(of_these_char : charset; workline : STRING; start : BYTE) : BYTE;
  291.   LABEL leave;
  292.   VAR
  293.     i                        : INTEGER;
  294.     ch                       : CHAR;
  295.   BEGIN
  296.     FOR i := start TO LENGTH(workline) DO
  297.     BEGIN
  298.       ch := workline[i];
  299.       IF ch IN of_these_char THEN GOTO leave;
  300.     END;
  301. leave:
  302.     find_next_char_position := i;
  303.   END;
  304.  
  305.   FUNCTION next_symbol(workline : STRING; VAR ndx : BYTE) : STRING;
  306.   LABEL leave;
  307.   VAR
  308.     i,
  309.     start_symbol,
  310.     end_symbol               : BYTE;
  311.     symbol                   : STRING;
  312.   BEGIN
  313.     symbol := '';
  314.     IF (LENGTH(workline) = 0)
  315.     OR (ndx > LENGTH(workline))
  316.     OR (ndx <= 0)
  317.     THEN
  318.     BEGIN
  319.       next_symbol := '';
  320.       ndx := 0;
  321.       GOTO leave;
  322.     END;
  323.     start_symbol := find_next_char_position(printables - [space, comma], workline, ndx);
  324.     end_symbol := find_next_char_position([space, comma], workline, start_symbol);
  325.     IF end_symbol = LENGTH(workline)
  326.     THEN symbol := COPY(workline, start_symbol, end_symbol - start_symbol + 1)
  327.     ELSE symbol := COPY(workline, start_symbol, end_symbol - start_symbol);
  328.     FOR i := 1 TO LENGTH(symbol) DO
  329.       IF symbol[i] = quote THEN symbol[i] := '''';
  330.     next_symbol := symbol;
  331.     IF ndx = LENGTH(workline)
  332.     THEN ndx := 0
  333.     ELSE ndx := end_symbol;
  334. leave:
  335.   END;
  336.  
  337.   FUNCTION occurs(symbol : STRING; looking_for : charset) : INTEGER;
  338.   VAR
  339.     i                        : INTEGER;
  340.     count                    : INTEGER;
  341.   BEGIN
  342.     count := 0;
  343.     FOR i := 1 TO LENGTH(symbol) DO
  344.       IF symbol[i] IN looking_for THEN INC(count);
  345.     occurs := count;
  346.   END;
  347.  
  348.   FUNCTION is_number(VAR symbol               : STRING;
  349.                      uses_exp                 : BOOLEAN;
  350.                      uses_percents            : BOOLEAN;
  351.                      delete_percents          : BOOLEAN) : BOOLEAN;
  352.   LABEL leave;
  353.   VAR
  354.     i                        : INTEGER;
  355.     is_num                   : BOOLEAN;
  356.     check_char               : SET OF CHAR;
  357.   BEGIN
  358.     is_num := FALSE;
  359.     check_char := numerics;
  360.     IF uses_exp THEN check_char := numerics + science;
  361.     IF uses_percents THEN check_char := numerics + percts;
  362.     IF uses_exp AND uses_percents THEN check_char := numerics + science + percts;
  363.     FOR i := 1 TO LENGTH(symbol) DO
  364.       IF symbol[i] IN check_char
  365.       THEN is_num := TRUE
  366.       ELSE
  367.       BEGIN
  368.         is_num := FALSE;
  369.         GOTO leave;
  370.       END;
  371.     IF uses_exp AND (occurs(symbol, science) > 1) THEN is_num := FALSE;
  372. leave:
  373.     is_number := is_num;
  374.     IF delete_percents AND is_num
  375.     THEN DELETE(symbol, POS('%', symbol), 1);
  376.   END;
  377.  
  378.   FUNCTION parse_section(start, finish : BYTE; workline : STRING) : STRING;
  379.   LABEL leave;
  380.   VAR
  381.     ndx                      : BYTE;
  382.     symbol,
  383.     section                  : STRING;
  384.   BEGIN
  385.     section := '';
  386.     IF workline = '' THEN GOTO leave;
  387.     ndx := start;
  388.     REPEAT
  389.       symbol := next_symbol(workline, ndx);
  390.       IF is_number(symbol, scientific, percent, delete_percent)
  391.       THEN section := section + symbol + comma
  392.       ELSE
  393.       BEGIN
  394.         IF trim(symbol) <> ''
  395.         THEN section := section + quote + symbol + quote + comma;
  396.       END;
  397.     UNTIL (ndx = 0) OR (ndx = LENGTH(workline)) OR (ndx >= finish) OR (trim(symbol) = '');
  398. leave:
  399.     parse_section := section;
  400.   END;
  401.  
  402.  
  403.  
  404.   FUNCTION real_str(real_value : REAL; exponential : BOOLEAN;
  405.                     field_width, decimal_width : INTEGER) : string80;
  406.   VAR
  407.     dummy                    : string80;
  408.   BEGIN
  409.     IF exponential THEN STR(real_value:field_width, dummy)
  410.     ELSE STR(real_value:field_width:decimal_width, dummy);
  411.     real_str := dummy;
  412.   END;
  413.  
  414.   FUNCTION boostr(boolean_value : BOOLEAN) : string5;
  415.   BEGIN
  416.     IF boolean_value THEN boostr := 'True'
  417.     ELSE boostr := 'False';
  418.   END;
  419.  
  420.   FUNCTION int_str(integer_value, field_width : INTEGER) : string10;
  421.   VAR
  422.     dummy                    : string10;
  423.   BEGIN
  424.     STR(integer_value:field_width, dummy);
  425.     int_str := dummy;
  426.   END;
  427.  
  428.  
  429.  
  430.  
  431. END.
  432.  
  433.